# Домашнее задание к занятию "`Базы данных, их типы`" - `Исаенков Евгений`

---

### Задание 1

Кейс
Крупная строительная компания, которая также занимается проектированием и девелопментом, решила создать правильную архитектуру для работы с данными. Ниже представлены задачи, которые необходимо решить для каждой предметной области.

Какие типы СУБД, на ваш взгляд, лучше всего подойдут для решения этих задач и почему?

1.1. Бюджетирование проектов с дальнейшим формированием финансовых аналитических отчётов и прогнозирования рисков. СУБД должна гарантировать целостность и чёткую структуру данных.

1.1.* Хеширование стало занимать длительно время, какое API можно использовать для ускорения работы?

1.2. Под каждый девелоперский проект создаётся отдельный лендинг, и все данные по лидам стекаются в CRM к маркетологам и менеджерам по продажам. Какой тип СУБД лучше использовать для лендингов и для CRM? СУБД должны быть гибкими и быстрыми.

1.2.* Можно ли эту задачу закрыть одной СУБД? И если да, то какой именно СУБД и какой реализацией?

1.3. Отдел контроля качества решил создать базу по корпоративным нормам и правилам, обучающему материалу и так далее, сформированную согласно структуре компании. СУБД должна иметь простую и понятную структуру.

1.3.* Можно ли под эту задачу использовать уже существующую СУБД из задач выше и если да, то как лучше это реализовать?

1.4. Департамент логистики нуждается в решении задач по быстрому формированию маршрутов доставки материалов по объектам и распределению курьеров по маршрутам с доставкой документов. СУБД должна уметь быстро работать со связями.

1.4.* Можно ли к этой СУБД подключить отдел закупок или для них лучше сформировать свою СУБД в связке с СУБД логистов?

1.5.* Можно ли все перечисленные выше задачи решить, используя одну СУБД? Если да, то какую именно?

Приведите ответ в свободной форме.

### Ответ

Наиболее подходящие СУБД для задач такой компании:

1.1. **Бюджетирование и аналитика**: Здесь подойдет реляционная СУБД, типа PostgreSQL или Oracle. Они обеспечивают высокую целостность данных и подходят для структурированных данных и сложных запросов. Для ускорения хеширования можно использовать API, например, Redis, для кэширования результатов.

1.2. **CRM и лендинги**: NoSQL СУБД, как MongoDB, подойдет для гибкости и скорости. Для CRM могут подойти решения типа Salesforce, которые уже включают в себя базы данных. Если хочется использовать одну СУБД, MongoDB может обслуживать и лендинги, и CRM, благодаря своей гибкости и масштабируемости.

1.3. **Корпоративные нормы и обучающий материал**: Здесь также подойдет реляционная СУБД, например, MySQL или PostgreSQL, для четкой структурированности данных. Можно использовать ту же СУБД, что и для бюджетирования, если структура данных схожа.

1.4. **Логистика**: Нужна СУБД с хорошей поддержкой связей, например, графовая СУБД, типа Neo4j. Она позволяет эффективно управлять сложными связями и маршрутизацией. Для отдела закупок можно использовать ту же СУБД, если важно управление связями, или реляционную, если нужна структура и целостность данных.

1.5.* **Единая СУБД для всех задач**: Сложно найти одно решение для всех этих разнообразных нужд. Реляционные СУБД хороши для структурированных данных и целостности, NoSQL — для гибкости и масштабируемости, а графовые — для управления сложными связями.

Если все же нужно выбрать одну СУБД для всех задач, я бы рекомендовал PostgreSQL. Это мощная, многофункциональная реляционная СУБД. Она обеспечивает высокую целостность данных, поддерживает сложные запросы и расширения, включая некоторые возможности NoSQL, что делает её достаточно гибкой для разных задач.

PostgreSQL подходит для бюджетирования и аналитики благодаря своей надежности и поддержке сложных запросов. Она может обработать и структурированные данные CRM, и неструктурированные данные лендингов. Также она подойдет для хранения корпоративных норм и обучающего материала.

Что касается логистики, PostgreSQL может не быть такой эффективной, как специализированные графовые СУБД, но она все же поддерживает геопространственные данные и сложные запросы, что делает её приемлемым выбором.

Это компромиссное решение, и может потребоваться дополнительная оптимизация для каждой конкретной задачи, но PostgreSQL — хороший выбор для универсальной СУБД.

---

### Задание 2

2.1. Пользователь пополняет баланс счёта телефона, распишите пошагово, какие действия должны произойти для того, чтобы транзакция завершилась успешно. Ориентируйтесь на шесть действий.

2.1.* Какие действия должны произойти, если пополнение счёта телефона происходило бы через автоплатёж?

Приведите ответ в свободной форме.

### Ответ

Вот шаги для успешной транзакции пополнения баланса телефона:

1. **Аутентификация пользователя**: Пользователь входит в систему (например, через мобильное приложение или веб-сайт), предоставляя свои учетные данные.

2. **Ввод данных для пополнения**: Пользователь вводит сумму пополнения и номер телефона, на который нужно пополнить счет.

3. **Выбор метода оплаты**: Пользователь выбирает способ оплаты (например, кредитная карта, банковский перевод, электронный кошелек).

4. **Обработка платежа**: Система обрабатывает платеж через платежный шлюз. Проверяется достаточность средств и подтверждение транзакции банком или платежной системой.

5. **Подтверждение транзакции**: После успешного списания средств, система отправляет запрос оператору мобильной связи на пополнение счета.

6. **Уведомление пользователя**: После подтверждения оператором пополнения счета, пользователь получает уведомление о успешном пополнении.

Теперь, если речь идет об автоплатеже:

1. **Настройка автоплатежа**: Пользователь настраивает автоплатеж, указывая номер телефона, сумму пополнения, способ оплаты и интервалы платежа.

2. **Автоматическая инициация транзакции**: По наступлению запланированной даты система автоматически инициирует платеж.

3. **Обработка платежа**: Система обрабатывает платеж аналогично ручной транзакции.

4. **Проверка успешности транзакции**: Система проверяет, была ли транзакция успешно обработана платежной системой.

5. **Уведомление пользователя**: После успешного пополнения пользователя уведомляют об успешном автоплатеже.

6. **Логирование транзакции**: Транзакция записывается в историю платежей пользователя для отчетности и контроля.

В случае автоплатежа ключевое отличие в том, что большинство действий происходит автоматически без непосредственного участия пользователя.

---

### Задание 3

3.1. Напишите пять преимуществ SQL-систем по отношению к NoSQL.

3.1.* Какие, на ваш взгляд, преимущества у NewSQL систем перед SQL и NoSQL.

Приведите ответ в свободной форме.

### Ответ

Вот основные преимущества SQL-систем по сравнению с NoSQL:

1. **Стандартизированный язык запросов**: SQL-системы используют стандартизированный язык запросов (SQL), что делает их более предсказуемыми и удобными для анализа и управления данными.

2. **Целостность данных**: Реляционные базы данных (SQL) обеспечивают строгую целостность данных с помощью ограничений, транзакций и структурированных схем данных.

3. **Сложные запросы**: SQL-системы лучше подходят для сложных запросов, особенно когда требуется много соединений и операций над данными.

4. **Масштабируемость и надежность**: Традиционные SQL-системы обеспечивают высокую надежность и поддерживают вертикальное масштабирование, что важно для критичных приложений.

5. **Транзакционность**: SQL-базы данных обеспечивают соблюдение свойств ACID (атомарность, согласованность, изоляция, долговечность), что критично для многих бизнес-приложений.

Теперь о преимуществах NewSQL перед SQL и NoSQL:

1. **Производительность и масштабируемость**: NewSQL сочетает в себе производительность и масштабируемость NoSQL с поддержкой транзакций и языка запросов SQL.

2. **Горизонтальное масштабирование**: В отличие от традиционных SQL-систем, NewSQL поддерживает горизонтальное масштабирование, что позволяет обрабатывать большие объемы данных и высокую нагрузку.

3. **Соблюдение ACID**: NewSQL сохраняет строгие требования к транзакционности, характерные для SQL.

4. **Более гибкая архитектура**: NewSQL обеспечивает более современную архитектуру, которая может лучше подходить для облачных вычислений и распределенных систем.

5. **Совместимость с SQL**: NewSQL обеспечивает совместимость с существующими SQL-запросами и приложениями, что облегчает миграцию и интеграцию.

---
### Задание 4

Необходимо производить большое количество вычислений при работе с огромным количеством данных, под эту задачу выделено 1000 машин.

На основе какого критерия будете выбирать тип СУБД и какая модель распределённых вычислений здесь справится лучше всего и почему?

Приведите ответ в свободной форме.

### Ответ

Для выбора типа СУБД и модели распределенных вычислений в такой задаче важно учитывать несколько ключевых критериев:

**Тип и структура данных**: Если данные хорошо структурированы и требуют сложных запросов с соединениями, лучше подойдет реляционная СУБД. Если данные неструктурированные или полуструктурированные и требуют высокой масштабируемости без сложных соединений, лучше NoSQL.

**Масштабируемость и производительность**: Для обработки больших данных на 1000 машин требуется система, поддерживающая горизонтальное масштабирование. Здесь подойдут NoSQL или NewSQL системы.

**Обработка запросов и вычислений**: Для высоких вычислительных нагрузок нужна СУБД, оптимизированная под распределенные вычисления.

**Требования к целостности и согласованности данных**: Если требуется высокая целостность данных и транзакционность, предпочтительнее SQL или NewSQL.

Теперь о выборе модели распределенных вычислений:

**MapReduce (например, Hadoop)**: Хорошо подходит для обработки больших объемов данных с высокой вычислительной нагрузкой. Он позволяет распределить задачу на множество узлов, обрабатывать их параллельно и затем собирать результаты. Эффективен для задач, где данные могут быть обработаны независимо в разных узлах.

**Spark**: Более новый и быстрый по сравнению с Hadoop, особенно когда речь идет о задачах, требующих множественных проходов по данным (например, машинное обучение). Spark лучше подходит для задач, где требуется быстрый доступ к данным и их повторная обработка.

Выбор между этими системами зависит от конкретных требований к задаче и характеристик данных. Если высокая производительность и быстрая обработка данных критичны, Spark может быть предпочтительнее. Если задача предполагает более простую обработку больших объемов данных с последующей агрегацией результатов, Hadoop с его экосистемой может быть более подходящим выбором.